from django.shortcuts import render

# Create your views here.

from django.views import View
from apps.carts.models import OrderInfo
from django.http import JsonResponse
from django.conf import settings
from alipay import AliPay
from utils.user import LoginRequiredJSONMixin


class AlipayUrlView(LoginRequiredJSONMixin, View):
    def get(self, request, order_id):
        # 1. 查询订单
        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=request.user,
                                          status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return JsonResponse({'code': 0, 'errmsg': '没有此订单'})

        # 3. 生成支付宝支付链接[看支付宝文档]
        """
        1. 准备   ----- 按照 sdk  设置公钥和私钥
        2. 实例化  ------ 创建支付宝实例对象
             appid,             沙箱的应用id
            app_notify_url,     支付宝支付成功之后,通知的url 可以为空
            app_private_key_string=None,
            alipay_public_key_string=None,

        3. 调用方法
        """
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        # 2.创建支付宝支付对象
        # alipay = AliPay(
        #     appid = settings.ALIPAY_APPID,
        #     app_notify_url = settings.ALIPAY_RETURN_URL,
        #     app_private_key_string=app_private_key_string,
        #     alipay_public_key_string=alipay_public_key_string,
        #
        # )
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
        )

        # 3.生成登录支付宝连接
        order_string = alipay.api_alipay_trade_page_pay(
            subject='美多商城支付',
            out_trade_no=order_id,
            total_amount=str(order.total_amount),
            return_url=settings.ALIPAY_RETURN_URL,
            notify_url=settings.ALIPAY_RETURN_URL,  #

        )

        # 4. # 响应登录支付宝连接
        # 真实环境电脑网站支付网关：https://openapi.alipay.com/gateway.do? + order_string
        # 沙箱环境电脑网站支付网关：https://openapi.alipaydev.com/gateway.do? + order_string
        alipay_url = settings.ALIPAY_URL + '?' + order_string

        return JsonResponse({'code': 0, 'alipay_url': alipay_url})


"""
需求:
        保存 支付宝交易成功 的 id
前端:
        会获取支付宝返回的数据,然后发送ajax请求. 将参数放在了 查询字符串中
后端:
        请求:  PUT     payment/status/?xxxx=xxx&xxxx=xxx
        业务:
                1.接收参数
                2.提取参数
                3.验证参数
                4. 保存支付宝订单id和 美多订单id
                5. 修改订单状态
                6. 返回响应
        响应:
                code:0,trade_id:xxx


"""


class PaymentStatusView(LoginRequiredJSONMixin, View):
    def put(self, request):
        # 1.接收参数
        data = request.GET.dict()
        # 2.提取参数
        # 获取并从请求参数中剔除signature
        signature = data.pop('sign')
        # 3.验证参数

        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        # 创建支付宝支付对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG
        )

        # verification
        # 验证数据
        success = alipay.verify(data, signature)

        if success:
            from apps.payment.models import Payment
            # 4. 保存支付宝订单id和 美多订单id
            order_id = data.get('out_trade_no'),
            trade_id = data.get('trade_no')
            Payment.objects.create(
                order_id=order_id,
                trade_id=trade_id
            )
            # 5. 修改订单状态
            from apps.carts.models import OrderInfo
            OrderInfo.objects.filter(order_id=order_id).update(
                status=OrderInfo.ORDER_STATUS_ENUM['UNSEND']
            )
            # 6. 返回响应
            return JsonResponse({'code': 0, 'trade_id': trade_id})

        return JsonResponse({'code': 400, 'errmsg': '稍后查询支付信息'})
